還記得第一次學習程式的時候,輸入 ”Hello world!” 的回憶嗎 ? 在逆向工程中雖沒辦法創造,但是可以透過分析來找回這份 ( 痛苦的 ) 記憶。
https://github.com/Dinlon5566/IT_Reverse_Engineering/blob/main/Dx03/HelloWorld_x64.exe
今天要使用上一篇的程式作為動態分析的範例,並使用 x64dbg
來進行操作。
當我們利用 x64dbg
開啟程式後,就可以看到很多指令在銀幕上。這時候按一下運行 ( F9 )
就會到程式的入口點 ( Entry point )
,但這裡還不是顯示 Hello world 的地方。在程式運行時還有許多動作,而我們的目標是要找到 main 函式。
熟悉以下幾個指令的快捷鍵 :
CALL
就進去 )CALL
就直接做完 )中斷點
或結束RET
指令透過反編譯器可以看到進入點的位置 : VA = 7FF601EA12C0
。這是裝載時的記憶體位置,每次都可能不一樣。而相對的程式起點 RVA = 000012C0
都會固定
sub
add
這兩個是給堆疊放出空間,可以忽略。
call 7FF601EA16A0
— 調用這個位置的函數 ( 16A0 )
jmp 7FF602EA1144
— 把位置跳到這個位置 ( 1144 )
現在透過 F8 把執行位置移動到 call
,並且使用 F7 進入這段函式。就可以看到很多指令,不過 main 不在這裡,所以使用 ctrl+F9 跳到 RETN
,並 F8 回到 12C9。
然後使用 F8 執行 jmp
指令後就會跳到目標位置 :
看起來很複雜,不過現在不用理解沒關係。這些是 VC++ 啟動函數,不同開發工具的啟動函數也不同。現在來找尋 main 函數,方法就是進入每一個 call,看看裡面有沒有 MessageBox API
,若沒有就 ctrl+F9 到 RET
後在回到上一層。要是搞混了也可以 ctrl+F2 重來。
找到後可以看到位置在 1000,正是 main 的起始位置。
利用 F8 執行至 101D 位置,可以看到字串被載入還有 MsgBox 彈出
很好,成功了。但每次都要從起點到目標或許花了太多時間,這邊介紹幾個比較快的方法 :
Break Point
的方式可以讓執行時碰到該點就自動暫停。main function
。既然我們已經找到了主函式的位置,代表可以監看與修改暫存器與檔案內容。透過查看原本的暫存器位置可以看到 "Hello world” 引用存在 RDX
,其值為字串存放位置。
複製該位置,在左下角資料視窗使用 ctrl+G 跳到該字串存放位置,在字元區選擇目標字串。這時候會發現字串是 "H . e . l . l . o ” 這樣,這是因為這裡使用了 Unicode
而不是 ascii。
選取要修改的位置,並且按下 ctrl+E 編輯資料。就可以於 Unicode
中改成你想要的文字,但最好不要超過原長度。
執行後就會發現變成你修改的文字
若是直接將儲存指令或資料的位置進行更改,也就會形成 Patch (補丁)了
https://github.com/Dinlon5566/IT_Reverse_Engineering/blob/main/Dx03/D02_tryHackme.exe
請透過 x64dbg
查出目標密碼。